package com.itheima.service.cargo.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.common.utils.UtilFuns;
import com.itheima.dao.cargo.*;
import com.itheima.domain.cargo.*;
import com.itheima.service.cargo.ExportService;
import com.itheima.vo.ExportProductResult;
import com.itheima.vo.ExportResult;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

/**
 * 报运单业务层
 */
@Service
public class ExportServiceImpl implements ExportService {

    @Autowired
    private ExportDao exportDao;
    @Autowired
    private ExportProductDao exportProductDao;
    @Autowired
    private ExtEproductDao extEproductDao;
    @Autowired
    private ContractDao contractDao;
    @Autowired
    private ContractProductDao contractProductDao;
    @Autowired
    private ExtCproductDao extCproductDao;

    //根据id查询
    @Override
    public Export findById(String id) {
        return exportDao.selectByPrimaryKey(id);
    }
    //保存
    @Override
    public void save(Export export) {

        //封装export自己的属性
        export.setId(UtilFuns.generateId());//id
        export.setCreateTime(new Date());//添加时间
        export.setState(0);//设置刚报运为草稿状态
        String customerContract = "";
        //修改contract合同的状态为以报运
        String[] contractId = export.getContractIds().split(",");//获取所有合同id
        for (String id : contractId) {//遍历数组
            Contract contract = contractDao.selectByPrimaryKey(id);//根据id查询合同
            contract.setState(2);//设置合同状态为已报运
            contractDao.updateByPrimaryKeySelective(contract);//修改合同的状态
            //合同或确认书号，它的组合是有逗号隔开
            customerContract += contract.getContractNo()+" ";
        }
        //设置报运单的合同或确认书号
        export.setCustomerContract(customerContract);

        //使用map集合存储合同下货物id和报运单下货物id的关系
        Map<String, String> map = new HashMap<>();

        //将contract合同下的货物复制到export报运合同的货物下
        ContractProductExample contractProductExample = new ContractProductExample();
        //添加条件为contractProduct中在contractId范围内的所有货物
        contractProductExample.createCriteria().andContractIdIn(Arrays.asList(contractId));
        //根据条件查询所有货物
        List<ContractProduct> productList = contractProductDao.selectByExample(contractProductExample);
        //3.2 遍历货物,每一个货物对应报运单中一个货物，并且要将合同货物copy到报运单货物
        for (ContractProduct contractProduct : productList) {//遍历合同下货物
            ExportProduct exportProduct = new ExportProduct();//创建报运单货物
            BeanUtils.copyProperties(contractProduct,exportProduct);//把合同下货物复制为报运单货物
            exportProduct.setId(UtilFuns.generateId());//设置报运单下货物的id
            exportProduct.setExportId(export.getId());//货物要与报运单做关联
            exportProductDao.insertSelective(exportProduct);//添加报运单下货物
            map.put(contractProduct.getId(),exportProduct.getId());//把合同下货物id和报运单下货物id存到map中
        }

        //将contract合同下货物的附件复制到export报运货物的附件下
        ExtCproductExample extCproductExample = new ExtCproductExample();
        //添加条件为extCproduct中在contractId范围内的所有附件
        extCproductExample.createCriteria().andContractIdIn(Arrays.asList(contractId));
        //根据条件查询所有附件
        List<ExtCproduct> extCproducts = extCproductDao.selectByExample(extCproductExample);
        //遍历附件，将合同货物下的附件copy到报运单下货物的附件中
        for (ExtCproduct extCproduct : extCproducts) {
            ExtEproduct extEproduct = new ExtEproduct();
            BeanUtils.copyProperties(extCproduct,extEproduct);
            extEproduct.setId(UtilFuns.generateId());
            //合同下货物的附件是可以获取到货物id
            extEproduct.setExportProductId(map.get(extCproduct.getContractProductId()));//设置报运表下货物id，来源于map集合中的key为合同下货物id的value值
            extEproduct.setExportId(export.getId());//设置报运表id
            extEproductDao.insertSelective(extEproduct);//调用方法保存附件
        }

        export.setExtNum(extCproducts.size());//报运单附件的数量
        export.setProNum(productList.size());//报运单下货物的数件

        exportDao.insertSelective(export);//添加报运单

    }
    //更新
    @Override
    public void update(Export export) {
        //更新报运表
        exportDao.updateByPrimaryKeySelective(export);
        //更新货物表
        List<ExportProduct> exportProducts = export.getExportProducts();
        if(exportProducts != null){
            for (ExportProduct exportProduct : exportProducts) {
                exportProductDao.updateByPrimaryKeySelective(exportProduct);
            }
        }


    }
    //删除
    @Override
    public void delete(String id) {

    }
    //分页查询
    @Override
    public PageInfo findAll(ExportExample example, int page, int size) {
        PageHelper.startPage(page,size);
        List<Export> exports = exportDao.selectByExample(example);
        return new PageInfo(exports);
    }
    ////更新电子报运的数据
    @Override
    public void updateE(ExportResult exportResult) {
        //1.根据海关回来报运单信息修改自己报运单
        Export export = new Export();
        export.setState(exportResult.getState());//设置状态
        export.setRemark(exportResult.getRemark());//设置描述
        export.setId(exportResult.getExportId());//设置报运单id
        exportDao.updateByPrimaryKeySelective(export);//调用方法更新报运单数据
        //2.根据返回的数据修改报运单下的货物
        Set<ExportProductResult> products = exportResult.getProducts();
        if(products != null){
            for (ExportProductResult pt : products) {
                ExportProduct product = new ExportProduct();
                product.setId(pt.getExportProductId());//修改id
                product.setTax(pt.getTax());//修改税
                exportProductDao.updateByPrimaryKeySelective(product);//调用接口更新货物数据
            }
        }
    }
}
